/*!
 * \file WtDtMgr.h
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief 数据管理器头文件
 * 
 * 数据管理器是WonderTrader系统中的核心数据服务组件，主要功能包括：
 * 1. 历史数据和实时数据的统一管理
 * 2. K线数据、Tick数据的缓存和访问
 * 3. 数据读取器的初始化和管理
 * 4. 数据推送和事件分发
 * 5. 复权数据的处理和管理
 * 6. 订单队列、委托明细、成交明细数据的管理
 * 
 * 该组件作为数据层的核心，为策略引擎提供统一的数据访问接口。
 */
#pragma once
#include <vector>
#include "../Includes/IDataReader.h"
#include "../Includes/IDataManager.h"

#include "../Includes/FasterDefs.h"
#include "../Includes/WTSCollection.hpp"

NS_WTP_BEGIN
class WTSVariant;
class WTSTickData;
class WTSKlineSlice;
class WTSTickSlice;
class IBaseDataMgr;
class IBaseDataMgr;
class WtEngine;

/**
 * @class WtDtMgr
 * @brief 数据管理器类
 * 
 * 数据管理器实现了完整的数据服务功能：
 * 1. 数据存储模块的初始化和管理
 * 2. 实时数据的接收、缓存和分发
 * 3. 历史数据的查询和切片服务
 * 4. K线数据的实时更新和维护
 * 5. 复权因子的计算和应用
 * 6. Level2数据（订单队列、委托明细、成交明细）的管理
 * 7. 数据事件的统一调度和分发
 * 
 * 该类同时实现了IDataReaderSink和IDataManager接口，
 * 作为数据读取器的回调接收器和数据服务的提供者。
 */
class WtDtMgr : public IDataReaderSink, public IDataManager
{
public:
	/**
	 * @brief 构造函数
	 * 
	 * 初始化数据管理器的基本属性
	 */
	WtDtMgr();
	
	/**
	 * @brief 析构函数
	 * 
	 * 清理数据缓存和释放资源
	 */
	~WtDtMgr();

private:
	/**
	 * @brief 初始化数据存储模块
	 * @param cfg 配置参数
	 * @return 是否初始化成功
	 * 
	 * 根据配置加载数据读取器模块，并进行初始化
	 */
	bool	initStore(WTSVariant* cfg);

public:
	/**
	 * @brief 初始化数据管理器
	 * @param cfg 配置参数
	 * @param engine 引擎指针
	 * @return 是否初始化成功
	 * 
	 * 设置引擎引用并初始化数据存储模块
	 */
	bool	init(WTSVariant* cfg, WtEngine* engine);

	/**
	 * @brief 注册历史数据加载器
	 * @param loader 历史数据加载器指针
	 * 
	 * 设置历史数据加载器，用于加载历史K线和Tick数据
	 */
	void	regsiter_loader(IHisDataLoader* loader) { _loader = loader; }

	/**
	 * @brief 处理推送的实时行情
	 * @param stdCode 标准合约代码
	 * @param newTick 新的Tick数据
	 * 
	 * 处理实时推送的Tick数据，更新缓存并触发相关事件
	 */
	void	handle_push_quote(const char* stdCode, WTSTickData* newTick);

	//////////////////////////////////////////////////////////////////////////
	// IDataManager接口实现
	
	/**
	 * @brief 获取Tick数据切片
	 * @param stdCode 标准合约代码
	 * @param count 数据数量
	 * @param etime 结束时间，默认为0
	 * @return Tick数据切片
	 */
	virtual WTSTickSlice* get_tick_slice(const char* stdCode, uint32_t count, uint64_t etime = 0) override;
	
	/**
	 * @brief 获取订单队列数据切片
	 * @param stdCode 标准合约代码
	 * @param count 数据数量
	 * @param etime 结束时间，默认为0
	 * @return 订单队列数据切片
	 */
	virtual WTSOrdQueSlice* get_order_queue_slice(const char* stdCode, uint32_t count, uint64_t etime = 0) override;
	
	/**
	 * @brief 获取委托明细数据切片
	 * @param stdCode 标准合约代码
	 * @param count 数据数量
	 * @param etime 结束时间，默认为0
	 * @return 委托明细数据切片
	 */
	virtual WTSOrdDtlSlice* get_order_detail_slice(const char* stdCode, uint32_t count, uint64_t etime = 0) override;
	
	/**
	 * @brief 获取成交明细数据切片
	 * @param stdCode 标准合约代码
	 * @param count 数据数量
	 * @param etime 结束时间，默认为0
	 * @return 成交明细数据切片
	 */
	virtual WTSTransSlice* get_transaction_slice(const char* stdCode, uint32_t count, uint64_t etime = 0) override;
	
	/**
	 * @brief 获取K线数据切片
	 * @param stdCode 标准合约代码
	 * @param period K线周期
	 * @param times 周期倍数
	 * @param count 数据数量
	 * @param etime 结束时间，默认为0
	 * @return K线数据切片
	 */
	virtual WTSKlineSlice* get_kline_slice(const char* stdCode, WTSKlinePeriod period, uint32_t times, uint32_t count, uint64_t etime = 0) override;
	
	/**
	 * @brief 获取最新Tick数据
	 * @param stdCode 标准合约代码
	 * @return 最新Tick数据
	 */
	virtual WTSTickData* grab_last_tick(const char* stdCode) override;
	
	/**
	 * @brief 获取复权因子
	 * @param stdCode 标准合约代码
	 * @param uDate 日期
	 * @return 复权因子
	 */
	virtual double get_adjusting_factor(const char* stdCode, uint32_t uDate) override;

	//////////////////////////////////////////////////////////////////////////
	// IDataReaderSink接口实现
	
	/**
	 * @brief K线数据更新回调
	 * @param code 合约代码
	 * @param period K线周期
	 * @param newBar 新的K线数据
	 * 
	 * 当数据读取器有新的K线数据时的回调函数
	 */
	virtual void	on_bar(const char* code, WTSKlinePeriod period, WTSBarStruct* newBar) override;
	
	/**
	 * @brief 所有K线数据更新完成回调
	 * @param updateTime 更新时间
	 * 
	 * 当所有K线数据更新完成时的回调函数，统一触发on_bar事件
	 */
	virtual void	on_all_bar_updated(uint32_t updateTime) override;

	/**
	 * @brief 获取基础数据管理器
	 * @return 基础数据管理器指针
	 */
	virtual IBaseDataMgr*	get_basedata_mgr() override;
	
	/**
	 * @brief 获取主力合约管理器
	 * @return 主力合约管理器指针
	 */
	virtual IHotMgr*		get_hot_mgr() override;
	
	/**
	 * @brief 获取当前日期
	 * @return 当前日期
	 */
	virtual uint32_t	get_date() override;
	
	/**
	 * @brief 获取当前分钟时间
	 * @return 当前分钟时间
	 */
	virtual uint32_t	get_min_time()override;
	
	/**
	 * @brief 获取当前秒数
	 * @return 当前秒数
	 */
	virtual uint32_t	get_secs() override;

	/**
	 * @brief 数据读取器日志回调
	 * @param ll 日志级别
	 * @param message 日志消息
	 * 
	 * 数据读取器的日志输出回调函数
	 */
	virtual void		reader_log(WTSLogLevel ll, const char* message) override;

	/**
	 * @brief 获取数据读取器
	 * @return 数据读取器指针
	 */
	inline IDataReader*	reader() { return _reader; }
	
	/**
	 * @brief 获取历史数据加载器
	 * @return 历史数据加载器指针
	 */
	inline IHisDataLoader*	loader() { return _loader; }

private:
	IDataReader*	_reader;		///< 数据读取器
	IHisDataLoader*	_loader;		///< 历史数据加载器
	WtEngine*		_engine;		///< 引擎指针

	faster_hashset<LongKey> _subed_basic_bars;		///< 已订阅的基础K线集合
	typedef WTSHashMap<LongKey> DataCacheMap;
	DataCacheMap*	_bars_cache;	///< K线缓存
	DataCacheMap*	_rt_tick_map;	///< 实时tick缓存
	
	// By Wesley @ 2022.02.11
	// 增加复权后的tick缓存
	// 因为前复权和不复权的数据都需要缓存
	DataCacheMap*	_ticks_adjusted;	///< 复权tick缓存

	/**
	 * @brief K线通知项结构体
	 * 
	 * 用于缓存K线更新通知，统一在所有K线更新完成后触发
	 */
	typedef struct _NotifyItem
	{
		std::string _code;		///< 合约代码
		std::string _period;	///< 周期字符串
		uint32_t	_times;		///< 周期倍数
		WTSBarStruct* _newBar;	///< 新K线数据
	} NotifyItem;

	std::vector<NotifyItem> _bar_notifies;	///< K线通知队列
};

NS_WTP_END